#include "gtrans.h"
#include "ui_gtrans.h"

void GTrans::on_groupTransDetailFiltre_toggled(bool arg1)
{
    //Lorsque les filtres sont décochés on enlève le filtre sur le tableau
    modelTransactions->setFilter("");
    modelTransactions->select();

    //On remet aussi les spins à 0
    ui->spinTransDetailsConcerne->setValue(0);
    ui->spinTransDetailsEt->setValue(0);
    ui->spinTransDetailMontant->setValue(0.0);
    ui->lineTransDetailIntitule->setText("");
    ui->dateTransDetailsDate->setDate(QDate::currentDate());
    ui->checkTransDetailPlus->setChecked(false);

}

void GTrans::on_buttonTransDetailFiltre_clicked()
{
    //On initialise un filtre
    QString f = "";
    bool first = true;

    //Si la valeur de la premiere fams est non nulle on fait une recherche sur debiteur et crediteur
    if(ui->spinTransDetailsConcerne->value()!=0){
        f = "((deb_fams = " + QString::number(ui->spinTransDetailsConcerne->value()) +" AND deb_proms = '"+ ui->comboTransDetailsConcerne->currentText() + "' ) OR (cre_fams = " + QString::number(ui->spinTransDetailsConcerne->value()) +" AND cre_proms = '"+ ui->comboTransDetailsConcerne->currentText() + "' ))" ;
        first = false;
    }

    //De même avec la deuxième fams
    if(ui->spinTransDetailsEt->value()!=0){
        f += " AND ((deb_fams = " + QString::number(ui->spinTransDetailsEt->value()) +" AND deb_proms = '"+ ui->comboTransDetailsEt->currentText() + "' ) OR (cre_fams = " + QString::number(ui->spinTransDetailsEt->value()) +" AND cre_proms = '"+ ui->comboTransDetailsEt->currentText() + "' ))" ;
    }

    //Si la date est check on vérifie la date
    if(ui->checkTransDetailPlus->isChecked()){
        if(!first){
            f += " AND ";
        }
        f += "DATE_FORMAT(tdate,'%d/%m/%Y') = '" + ui->dateTransDetailsDate->text() + "'";
        first = false;
    }

    //Si l'intitule est non vide on le vérifie aussi
    if(!ui->lineTransDetailIntitule->text().isEmpty()){
        if(!first){
            f += " AND ";
        }
        f += "libelle LIKE '%" + ui->lineTransDetailIntitule->text() + "%'";
        first = false;
    }

    //Si le montant est non vide on test le montant aussi
    if(ui->spinTransDetailMontant->value() != 0){
        if(!first){
            f += " AND ";
        }
        f += "montant = " + QString::number(ui->spinTransDetailMontant->value());
        first = false;
    }

    //On applique le filtre et on rafraichit
    modelTransactions->setFilter(f);
    modelTransactions->select();

}

void GTrans::on_spinTransDetailsConcerne_valueChanged(int arg1)
{

    if(arg1 != 0){

        //Si la valeur devient non nulle, on recherche les proms
        QSqlQueryModel *m = new QSqlQueryModel(this);
        QSqlQuery q(db);
        q.prepare("SELECT proms FROM v_users WHERE fams = :f");
        q.bindValue(":f",arg1);
        q.exec();
        m->setQuery(q);
        ui->comboTransDetailsConcerne->setModel(m);

        //Et on autorise le filtre sur le deuxieme compte
        ui->spinTransDetailsEt->setEnabled(true);
        ui->comboTransDetailsEt->setEnabled(true);

    } else {

        //Si elle est nulle on reinitialise les proms (en supprimant le modele)
        QAbstractItemModel *m = ui->comboTransDetailsConcerne->model();
        delete m;

        //On remet à 0 la deuxième recherche et on l'interdit
        ui->spinTransDetailsEt->setValue(0);
        ui->spinTransDetailsEt->setEnabled(false);
        ui->comboTransDetailsEt->setEnabled(false);
    }
}

void GTrans::on_spinTransDetailsEt_valueChanged(int arg1)
{
    if(arg1 != 0){

        //Si la valeur devient non nulle, on recherche les proms
        QSqlQueryModel *m = new QSqlQueryModel(this);
        QSqlQuery q(db);
        q.prepare("SELECT proms FROM v_users WHERE fams = :f");
        q.bindValue(":f",arg1);
        q.exec();
        m->setQuery(q);
        ui->comboTransDetailsEt->setModel(m);

    } else {

        //Si elle est nulle on reinitialise les proms (en supprimant le modele)
        QAbstractItemModel *m = ui->comboTransDetailsEt->model();
        delete m;
    }
}

void GTrans::on_spinTransNewDepuis_valueChanged(int arg1)
{
    if(arg1 != 0){

        //Si la valeur devient non nulle, on recherche les proms
        QSqlQueryModel *m = new QSqlQueryModel(this);
        QSqlQuery q(db);
        q.prepare("SELECT proms FROM v_users WHERE fams = :f");
        q.bindValue(":f",arg1);
        q.exec();
        m->setQuery(q);
        ui->comboTransNewDepuis->setModel(m);

    } else {

        //Si elle est nulle on reinitialise les proms (en supprimant le modele)
        QAbstractItemModel *m = ui->comboTransNewDepuis->model();
        delete m;
    }
}

void GTrans::on_spinTransNewVers_valueChanged(int arg1)
{
    if(arg1 != 0){

        //Si la valeur devient non nulle, on recherche les proms
        QSqlQueryModel *m = new QSqlQueryModel(this);
        QSqlQuery q(db);
        q.prepare("SELECT proms FROM v_users WHERE fams = :f");
        q.bindValue(":f",arg1);
        q.exec();
        m->setQuery(q);
        ui->comboTransNewVers->setModel(m);

    } else {

        //Si elle est nulle on reinitialise les proms (en supprimant le modele)
        QAbstractItemModel *m = ui->comboTransNewVers->model();
        delete m;
    }
}

void GTrans::on_buttonTransNewAnnuler_clicked()
{

    //On remet à zéro tous les champs
    ui->spinTransNewDepuis->setValue(0);
    ui->spinTransNewVers->setValue(0);
    ui->spinTransNewMontant->setValue(0.0);
    ui->lineTransNewIntitule->setText("");

    ui->toolBox->setCurrentIndex(0);

    modelTransactions->select();
}

void GTrans::on_buttonTransNewValider_clicked()
{
    //On vérifie la validité des champs
    if(ui->comboTransNewDepuis->currentText() != "" && ui->comboTransNewVers->currentText()!= "" && ui->spinTransNewMontant->value() > 0 && ui->lineTransNewIntitule->text() != ""){

        //On créer la requete et on l'execute
        QSqlQuery q(db);
        q.prepare("CALL faire_transaction(get_compte(:df,get_proms(:dp)),get_compte(:cf,get_proms(:cp)),:m,:i)");
        q.bindValue(":df",ui->spinTransNewDepuis->value());
        q.bindValue(":dp",ui->comboTransNewDepuis->currentText());
        q.bindValue(":cf",ui->spinTransNewVers->value());
        q.bindValue(":cp",ui->comboTransNewVers->currentText());
        q.bindValue(":m",ui->spinTransNewMontant->value());
        q.bindValue(":i",ui->lineTransNewIntitule->text());
        q.exec();
        q.finish();

        on_buttonTransNewAnnuler_clicked();


    } else {

        //Sinon on envoie un avertissement
        QMessageBox::warning(this,"Champs incomplet","Vous devez remplir tous les champs pour créer une transaction!");
    }
}

void GTrans::sommeSelectionnee()
{
    QItemSelectionModel *m = ui->tableTransDetail->selectionModel();
    double somme = 0.0;
    int lignes = 0;
    for(int i = 0 ; i< modelTransactions->rowCount(); i++){
        if(m->isRowSelected(i,QModelIndex())){
            somme += modelTransactions->index(i,10).data().toDouble();
            lignes++;
        }
    }

    QString text = QString::number(lignes);
    text += lignes > 1 ? " selectionées" : " selectionée";
    ui->labelTransSomme->setText(text +" pour un total de "+QString::number(somme,'f',2)+" €.");
}


void GTrans::on_buttonTransDetailImprimer_clicked()
{
    // Création de la classe rapport
    QModelDataReport *rapport = new QModelDataReport(modelTransactions,this);

    // Création des listes de paramètres
    QList<int> listofcolumns;
    QList<int> listofwidth;
    QStringList listofheader;
    QList<int> alignment;
    QList<QModelDataReport::dataFormat> tableformat;
    QList<QVariant> listTotaux;

    // Initialisation des formats spéciaux
    QModelDataReport::dataFormat dformatstring;
    dformatstring.strFormat="%1";
    dformatstring.typeFormat=QModelDataReport::typeIsQString;
    dformatstring.fieldwidthFormat=0;
    dformatstring.fillFormat="";
    QModelDataReport::dataFormat dformatdate;
    dformatdate.strFormat="%1";
    dformatdate.typeFormat=QModelDataReport::typeIsQDate;
    dformatdate.fieldwidthFormat=0;
    dformatdate.fillFormat="dd-MM-yy";
    QModelDataReport::dataFormat dformateuro;
    dformateuro.strFormat="%1€";
    dformateuro.typeFormat=QModelDataReport::typeIsCurrency;
    dformateuro.fieldwidthFormat=12;
    dformateuro.fillFormat="";

    // Initialisation des listes
    listofcolumns << 1 << 3 << 5 << 7 << 9 << 10 << 11;
    listofheader << "Date" << "Débiteur" << "" << "Créditeur" << "" << "Montant" << "Libellé" ;
    listofwidth << 8 << 18 << 7 << 18 << 7 << 12 << 30 ;
    alignment << (Qt::AlignLeft| Qt::AlignVCenter) << (Qt::AlignRight | Qt::AlignVCenter) << (Qt::AlignLeft | Qt::AlignVCenter) << (Qt::AlignRight | Qt::AlignVCenter) << (Qt::AlignLeft | Qt::AlignVCenter) << (Qt::AlignRight | Qt::AlignVCenter) << (Qt::AlignRight | Qt::AlignVCenter);
    tableformat << dformatdate << dformatstring << dformatstring << dformatstring << dformatstring << dformateuro << dformatstring ;
    listTotaux << 0 << 0 << 0 << 0 << 0 << 0 << 0 ;

    // On passe les listes en paramètres
    rapport->setListofColumns(&listofcolumns);
    rapport->setColumnWidthPercentage(&listofwidth);
    rapport->setListofColumnsHeader(&listofheader);
    rapport->setCellsAlignment(&alignment);
    rapport->setCellsDataFormat(&tableformat);

    // On récupère le total
    rapport->getSumOfnumColumns(&listTotaux);

    // Définition des polices
    QFont font = this->font();
        // Titre
    font.setPointSize(16);
    rapport->setTitleFont(font);
    rapport->setTitleText("Transactions");
        // Corps
    font.setPointSize(8);
    rapport->setBodyFont(font);
        // Headers
    font.setPointSize(12);
    rapport->setHeaderPageFont(font);
        // Sous-titre
    font.setPointSize(14);
    rapport->setHeaderReportFont(font);
    rapport->setHeaderReportHeight(25);
    rapport->setHeaderReportText("");
        // Pied
    font.setPointSize(14);
    rapport->setFooterPageFont(font);
    rapport->setFooterPageRightText("AE ENSAM Angers");
        // Fin de rapport
    font.setPointSize(14);
    rapport->setEndReportFont(font);
    rapport->setEndReportHeight(80);
    rapport->setEndReportText("Total : "+QString::number(listTotaux.at(5).toDouble(),'f',2)+" €");
    rapport->model_print();
}

